package com.arsenavid.maven.web.servlet;

import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.persistence.PersistenceException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.arsenavid.aterrizacomopuedas.model.Aeropuerto;
import com.arsenavid.aterrizacomopuedas.model.Vuelo;
import com.arsenavid.aterrizacomopuedas.service.GestionVuelosService;
import com.arsenavid.aterrizacomopuedas.service.GestionVuelosServiceImpl;

/**
 * Servlet implementation class BuscarVuelosServlet
 */
public class BuscarVuelosServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private int contador = 0;
	
	@Override
	public void init() throws ServletException {
		contador = contador + 1;
		System.out.println(contador);
	}
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Recuperamos el usario que envía la peticion 
		Principal principal = request.getUserPrincipal();
		String username = (principal == null) ? null : principal.getName(); 
		
		//Si nos pulsan el boton "buscar" del formulario
		if (request.getParameter("buscar") != null || request.getParameter("siguiente") != null) {
			//Creamos la modelización del formulario para su validación
			BuscarVuelosForm form = new BuscarVuelosForm(request);
			//Si es válido y está con todos los parametros correctos mostramos el listado de vuelos
			if (isValidForm(form)) {
				mostrarListado(request, response, form);
			//Sino mostramos de nuevo el formulario con loss msg de error	
			} else {
				mostrarFormulario(request, response, form);
			}
		//Si nos pulsan el boton "comprar" del listado de vuelos	
		} else if (request.getParameter("comprar") != null) {
			BuscarVuelosForm form = new BuscarVuelosForm(request);
			
			if (isValidForm(form)) {
				mostrarDatosVuelo(request, response, form);
			} else {
				mostrarListado(request, response, form);
			}
		} else if (request.getParameter("validar") != null) {
			BuscarVuelosForm form = new BuscarVuelosForm(request);
			if (isValidForm(form)) {
				mostrarTarjetaEmbarque(request, response, form);
			} else {
				mostrarDatosVuelo(request, response, form);
			}
		}
		else {
			BuscarVuelosForm form = new BuscarVuelosForm();
			form.setFechaPartida(new Date());
			form.setObjetoInicial(0);
			mostrarFormulario(request, response, form);
		}	
	}

	private void mostrarTarjetaEmbarque(HttpServletRequest request,
			HttpServletResponse response, BuscarVuelosForm form) throws ServletException, IOException {
		
		GestionVuelosService servicio = new GestionVuelosServiceImpl();
		try {
			servicio.comprarBillete(form.getNombre(), form.getNifcif(), form.getVueloseleccionado());
		} catch (PersistenceException exc) {
			form.getMensajesError().add("No se ha podido registrar el vuelo. Intentelo de nuevo");
		}
		
		request.setAttribute("form", form);
		RequestDispatcher dispatcher = 
				request.getRequestDispatcher("tarjetaEmbarque.jsp");
		dispatcher.forward(request, response);
		
	}
	private void mostrarDatosVuelo(HttpServletRequest request,
			HttpServletResponse response, BuscarVuelosForm form) throws ServletException, IOException {
		
		GestionVuelosService servicio = new GestionVuelosServiceImpl();
		Vuelo vuelo = servicio.obtenerVueloById(form.getVueloseleccionado());
		if (vuelo.getId() == 0) {
			form.getMensajesError().add("No existe el vuelo");
			mostrarListado(request, response, form);
		} else {
			request.setAttribute("vuelo", vuelo);
			request.setAttribute("form", form);
			RequestDispatcher dispatcher = 
				request.getRequestDispatcher("comprarBillete.jsp");
			dispatcher.forward(request, response);
		}
		
	}
	private void mostrarListado(HttpServletRequest request,
			HttpServletResponse response, BuscarVuelosForm form) throws ServletException, IOException {
		
		/**
		 * MOSTRAR VUELOS */
		GestionVuelosService servicio = new GestionVuelosServiceImpl();
		List<Vuelo> vuelos = 
				servicio.obtenerVuelos(form.getIataAeroOrigen(),
				 					   form.getIataAeroDestino(),
				 					   form.getFechaPartida(),
				 					   form.getObjetoInicial(),10,servicio.SORT_AITA_PRECIO_ASC);
		
		request.setAttribute("vuelos", vuelos);
		form.setObjetoInicial(form.getObjetoInicial()+10);
		request.setAttribute("form", form);
		
		RequestDispatcher dispatcher = 
				request.getRequestDispatcher("mostrarVuelos.jsp");
		dispatcher.forward(request, response);
	}

	private boolean isValidForm(BuscarVuelosForm buscarVuelosForm) {
		boolean isValid = false;
		List<String> msgErrores = buscarVuelosForm.getMensajesError();
		
		if(msgErrores.size() == 0) {
			isValid = true;
		}
		
		return isValid;
		
	}
	private void mostrarFormulario(HttpServletRequest request,
			HttpServletResponse response, BuscarVuelosForm form) throws ServletException, IOException {	
		
		/**
		 * MOSTRAR FORMULARIO AEROPUERTOS*/
		if (form != null) {
			request.setAttribute("form", form);
		}
		
		GestionVuelosService servicio = new GestionVuelosServiceImpl();
		Set<Aeropuerto> aeropuertos = servicio.obtenerAeropuertos();
		
		Set<Aeropuerto> aeropuertosOrdenados = new TreeSet<Aeropuerto>();
		aeropuertosOrdenados.addAll(aeropuertos);
		
		/**
		 * List<Aeropuerto> aeroOrdenados = new ArrayList<Aeropuerto>(aeropuertos);
		 * Collections.sort(aeroOrdenados, new AeroPorNombreComp());
		 */
		
		request.setAttribute("aeropuertos", aeropuertosOrdenados);
		
		RequestDispatcher dispatcher = 
				request.getRequestDispatcher("form_formulario.jsp");
		dispatcher.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}
